package com.huiw.archives.modules.sys.dao;

import java.util.List;
import java.util.Map;

import com.huiw.archives.common.utils.database.PageParams;

/**
 * @author 杨成 E-mail:yangcheng@wiswit.com
 * @version 创建时间：2017年3月3日 下午4:11:00 类说明 ：Dao通用接口
 */

public interface CommonDao {

	/**
	 * 只有第一次访问数据库，后面再查询相同的时候直接访问缓存
	 */
	Object load(String id, Object entity);

	/**
	 * 用一次就访问一次数据库
	 */
	Object get(String id, Object entity);

	/**
	 * 查询所有记录
	 */
	List<Object> findAll(Object entity);

	/**
	 * persist如果在transaction之外调用，不会导致insert语句的立即执行，而是在flush时执行insert语句。
	 * persist如果在transaction之内调用，会导致insert语句的立即执行 ，适用于被扩展的Session上下文的长期运行的会话中
	 */
	void persist(Object entity);

	/**
	 * 集合了save和update方法，为了提高效率，尽量不用
	 */
	boolean saveOrUpdate(Object entity);

	/**
	 * 作用就是将session的缓存中的数据与数据库同步
	 */
	void flush();

	/**
	 * 
	 * YC 2017年7月6日 下午5:15:05
	 * <p>
	 * Title: save
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @return
	 */

	public boolean save(Object object);

	/**
	 * 
	 * YC 2017年7月6日 下午5:15:21
	 * <p>
	 * Title: delete
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @return
	 */
	public boolean delete(Object object);

	/**
	 * 
	 * YC 2017年7月6日 下午5:15:27
	 * <p>
	 * Title: update
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @return
	 */
	public boolean update(Object object);

	/**
	 * 
	 * YC 2017年7月6日 下午5:15:32
	 * <p>
	 * Title: query
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param id
	 * @param object
	 * @return
	 * @throws Exception
	 */
	public Object query(String id, Object object) throws Exception;

	/**
	 * YC 2017年7月6日 下午5:16:31
	 * <p>
	 * Title: query
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param key
	 * @param value
	 * @return
	 */
	public List<Object> query(Object object, Object[] key, Object[] value);

	/**
	 * YC 2017年7月6日 下午5:16:56
	 * <p>
	 * Title: query
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @return
	 */
	public List<Object> query(Object object);

	/**
	 * YC 2017年7月6日 下午5:17:00
	 * <p>
	 * Title: queryOrderDesc
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param keys
	 * @param maxResults
	 * @return
	 */
	public List<Object> queryOrderDesc(Object object, String keys, int maxResults);

	/**
	 * YC 2017年7月6日 下午5:17:11
	 * <p>
	 * Title: queryOrderAsc
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param keys
	 * @param maxResults
	 * @return
	 */
	public List<Object> queryOrderAsc(Object object, String keys, int maxResults);

	/**
	 * YC 2017年7月6日 下午5:17:14
	 * <p>
	 * Title: queryLastRecordId
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @return
	 */
	public Object queryLastRecordId(Object object);

	/**
	 * YC 2017年7月6日 下午5:17:22
	 * <p>
	 * Title: query
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param curPage
	 * @param max
	 * @param keys
	 * @param values
	 * @return
	 */
	public List<Object> query(Object object, int curPage, int max, String keys, String values);

	/**
	 * YC 2017年7月6日 下午5:17:27
	 * <p>
	 * Title: query
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param curPage
	 * @param max
	 * @param key
	 * @param value
	 * @return
	 */
	public List<Object> query(Object object, int curPage, int max, Object[] key, Object[] value);

	/**
	 * YC 2017年7月6日 下午5:17:33
	 * <p>
	 * Title: queryRecordNum
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param keys
	 * @param values
	 * @return
	 */
	public double queryRecordNum(Object object, String keys, Object values);

	/**
	 * 刘超 2017年7月6日 下午5:17:33
	 * <p>
	 * Title: hql查询
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param hql
	 * @return List
	 * @throws Exception 
	 */
	public List<Object> queryByHql(String hql) throws Exception;

	/**
	 * yangc 2017年10月12日 下午12:35:44
	 * <p>
	 * Title: query
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param params
	 * @return
	 * @throws Exception
	 */
	List<Object> query(Object object, PageParams params) throws Exception;

	/**
	 * yangc 2017年10月13日 下午6:07:39
	 * <p>
	 * Title: query
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param params
	 * @param whereParams
	 * @return
	 * @throws Exception
	 */
	List<Object> query(Object object, PageParams params, Map<String, Object> whereParams) throws Exception;

	/**
	 * yangc 2017年10月19日 下午6:18:10
	 * <p>
	 * Title: deletebatch
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param object
	 * @param ids
	 * @throws Exception
	 */
	boolean deletebatch(Object object, String[] ids) throws Exception;

	/**
	 * yangc 2017年11月21日 下午3:42:36
	 * <p>
	 * Title: queryRecordNum
	 * </p>
	 * <p>
	 * Description: 获取该表某类型记录总条数{object表，keys字段，values字段对应值,operator运算符}
	 * </p>
	 * 
	 * @param object
	 * @param keys
	 * @param values
	 * @param operator
	 * @return
	 */
	double queryRecordNum(Object object, String keys, Object values, String operator);

	/**
	*yangc 
	*2017年11月21日 下午4:39:16
	* <p>Title: queryRecordNumByAND</p> 
	* <p>Description: 获取该表多条件记录总条数{object表，keys字段，values字段对应值}</p> 
	* @param object
	* @param keys
	* @param values
	* @return 
	*/
	double queryRecordNumByAND(Object object, String[] keys, Object[] values, String[] operator);

}